//给定一个字符串 s ，请你找出其中不含有重复字符的 最长 子串 的长度。 
//
// 
//
// 示例 1: 
//
// 
//输入: s = "abcabcbb"
//输出: 3 
//解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
// 
//
// 示例 2: 
//
// 
//输入: s = "bbbbb"
//输出: 1
//解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
// 
//
// 示例 3: 
//
// 
//输入: s = "pwwkew"
//输出: 3
//解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
//     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
// 
//
// 
//
// 提示： 
//
// 
// 0 <= s.length <= 5 * 10⁴ 
// s 由英文字母、数字、符号和空格组成 
// 
//
// Related Topics 哈希表 字符串 滑动窗口 👍 10975 👎 0


import java.util.HashMap;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int lengthOfLongestSubstring(String s) {

        HashMap<Character, Integer> map = new HashMap<>();

        int begin = 0;
        int maxSize = 0;
        for (int end = 0; end < s.length(); end++) {
            Character ch = s.charAt(end);
            if (map.containsKey(ch)) {
                begin = Math.max(begin, map.get(ch) + 1);//abba 防止begin往回走，bba的时候begin会往回走，所以加一个这个判断
//                begin = map.get(ch) + 1;//遇到重复字符，更新字符的起始点。
//                System.out.println("begin update:" + begin);
//                System.out.println("end:" + begin);
                map.put(ch, end);
            } else {
//                System.out.println("begin:" + begin);
//                System.out.println("end:" + begin);
                map.put(ch, end);
            }
//            System.out.println(s.substring(begin, end+1));
            maxSize = Math.max(maxSize, end - begin + 1);
        }
        return maxSize;
    }

}
//leetcode submit region end(Prohibit modification and deletion)
